Садржај
Пример моделовања - факултет
Пример моделовања - продаја дигиталних композиција
Пројектни задатак - моделовање
Погледи
Пројектни задатак

Задаци - групне функције и спајање табела

Сви задаци који следе могу да се провежбају и у систему SQL Server Management Studio.

Упити се пишу и покрећу када се кликне New Query након што се покрене систем SQL Server и кликне на креирану базу Pesme у прозору Object Explorer. Фајл са упитима SQLQuery1.sql може, али и не мора да се сачува.

Након што се унесе једна команда, кликне се на дугме Execute. Уколико се у простору за писање команди налази више њих, потребно је обележити ону коју желимо да покренемо. Ако има више база података, обавезно проверити да ли је поред овог дугмета назив базе у којој желите да вршите упите.

../_images/slika_433a.png

Сви наредни SELECT упити обрађују податке из базе података фиктивне компаније за продају музичких композиција (углавном песама). Следи списак свих табела са колонама. Примарни кључеви су истакнути болдом, а страни италиком.

../_images/slika_433b.png
  1. За сваког извођача приказати укупан број снимљених минута, заокружен на две децимале.

SELECT izvodjac.naziv, round(SUM(kompozicija.trajanje) / (1000.0 * 60.0), 2) AS minuti
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album
JOIN izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
../_images/slika_436p1.png

2. За сваког извођача приказати број композиција снимљених у MPEG формату. Занемарити оне извођаче који имају мање од пет таквих композиција.

SELECT izvodjac.naziv, round(SUM(kompozicija.trajanje) / (1000.0 * 60.0), 2) AS minuti
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album JOIN
        izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
../_images/slika_436p2.png
  1. За сваки жанр приказати назив жанра и просечно трајање композиције у секундама (уредити их опадајуће, по трајању).

SELECT izvodjac.naziv, round(SUM(kompozicija.trajanje) / (1000.0 * 60.0), 2) AS minuti
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album JOIN
        izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
../_images/slika_436p3.png
  1. Приказати укупну дужину свих композиција групе Metallica.

SELECT SUM(trajanje) AS ukupno_trajanje
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album JOIN
        izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
WHERE izvodjac.naziv = 'Metallica'
../_images/slika_436p4.png
  1. Приказати извођаче којима је просечна дужина трајања композиције између три и четири минута.

SELECT izvodjac.naziv, round(AVG(trajanje / (1000.0 * 60.0)), 2) AS prosecno_minuta
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album JOIN
        izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
HAVING prosecno_minuta BETWEEN 3.0 AND 4.0
../_images/slika_436p5.png
  1. За сваког уметника/групу који има пет или више албума приказати број албума (резултат приказати сортирано по броју албума, опадајуће)

SELECT izvodjac.naziv, COUNT(*) AS broj_albuma
FROM izvodjac JOIN
        album ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
HAVING broj_albuma >= 5
ORDER BY broj_albuma DESC
../_images/slika_436p6.png

7. За сваког уметника/групу који има пет или више албума приказати број албума (резултат приказати сортирано по броју албума, опадајуће)

SELECT izvodjac.naziv, count(DISTINCT kompozicija.id_zanr) AS broj_zanrova
FROM kompozicija JOIN
        album ON kompozicija.id_album = album.id_album JOIN
        izvodjac ON izvodjac.id_izvodjac = album.id_izvodjac
GROUP BY izvodjac.id_izvodjac
HAVING broj_zanrova > 1
ORDER BY broj_zanrova DESC
../_images/slika_436p7.png

8. За сваког извођача приказати идентификатор, име и укупан број рок композиција које је снимио (ако није снимио ниједну, приказати нулу).

Пошто се тражи приказ броја композиција за све извођаче, а многи извођачи нису снимили ниједну рок композицију, потребно је да употребимо лево спајање.

SELECT i.naziv, COUNT(k.naziv) AS broj_rok_kompozicija
FROM (izvodjac i JOIN
        album a ON a.id_izvodjac = i.id_izvodjac)
LEFT JOIN
        (kompozicija k JOIN
        zanr z ON k.id_zanr = z.id_zanr AND z.naziv = 'Rock') ON a.id_album = k.id_album
GROUP BY i.id_izvodjac
ORDER BY broj_rok_kompozicija DESC
../_images/slika_436p8.png
  1. За сваки жанр приказати дужину најкраће и најдуже композиције.



10. Приказати број ставки на свакој наруџбеници испорученој у Бразил (приказати идентификатор наруџбенице, име и презиме купца и број ставки). Резултате сортирати неопадајуће по броју ставки.



11. Приказати имена, презимена и укупне износе наруџбина (заокружене на 2 децимале) сваког купца за 3 купаца који су направили највеће износе наруџбина. Резултат приказати опадајуће по укупном износу.



12. За сваког запосленог прикази идентификатор, име, презиме, број запослених којима је он надређени службеник. Приказати и оне запослене којима је тај број једнак нули.



(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+